/**
 * 遍历AST语法树
 */
function walk(ast, {enter, leave}) {
  visit(ast, null, enter, leave);
}

/**
 * 访问此node节点
 * @param node
 * @param parent
 * @param enter
 * @param leave
 */
function visit(node, parent, enter, leave) {
  //先执行此节点的enter方法
  if (enter) { // 先执行此节点的enter方法
    enter(node, parent);
    // enter.call(context,node, parent);
  }

  //再遍历子节点 找出那些是对象的子节点
  const childKeys = Object.keys(node).filter(key => typeof node[key] === 'object');
  childKeys.forEach(childKey => {
    const value = node[childKey];
    if (Array.isArray(value)) {
      value.forEach(val => visit(val, node, enter, leave));
    }else if(value && value.type){ //遍历的时候只遍历有type属性的对象
      visit(value, node, enter, leave);
    }
  })

  //再执行离开方法
  if(leave){
    leave(node, parent)
  }
}

module.exports = walk;
